#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

static void *task(void *arg)
{
	puts("children thread is working! \n");
	
	// 线程的退出，最好使用pthread_exit()，可以对线程资源进行回收。
	pthread_exit(NULL);
	//return NULL;
}

struct p_thread_arg_st
{
	int client_id;
	pthread_mutex_t mutex;
	pthread_cond_t cond;
};

static void *task_args(void *arg)
{
	struct p_thread_arg_st * args = (struct p_thread_arg_st *)arg;
	printf("client_id: %d\n",args->client_id);
    pthread_exit(arg);
}

// 创建线程的时候传参：https://blog.csdn.net/qq_55125921/article/details/134130670
/*
 * 线程的创建
 * */
int main(int argc, char **argv)
{
	pthread_t tid,tid2;
	int tret,tret2;
	void *ptr;

	puts("---------------begin!!!\n");
	
	tret = pthread_create(&tid, NULL, task, NULL);
	if(tret)
	{
		// 线程创建失败
		fprintf(stderr, "pthread_create() is failed, error : %s \n",strerror(tret));
		exit(1);
	}
	struct p_thread_arg_st * args = (struct p_thread_arg_st *)malloc(sizeof(struct p_thread_arg_st));
	args->client_id = 5;
	tret2 = pthread_create(&tid2, NULL, task_args, (void *)args);
	if(tret2)
	{
		// 线程创建失败
		fprintf(stderr, "pthread_create() is failed, error : %s \n",strerror(tret2));
		exit(1);
	}

	// 会给线程收尸，等待线程执行结束，第二个参数NULL，表示从pthread_exit(NULL)返回的状态，可以使用一个指针的地址进行接收
	pthread_join(tid, NULL);
	
	pthread_join(tid2, &ptr);
	args = (struct p_thread_arg_st *)ptr;
	printf("return client_id: %d\n",args->client_id);
	free(ptr);

	puts("---------------end!!!\n");

	exit(0);
}
